# CPM base Context Engineering
from typing import Dict
from apps.cpm.cpm_engine import CpmEngine
from apps.cpm.ce.main_agent import MainAgent
from apps.cpm.ce.atom_ce import AtomCe
from apps.cpm.ce_system import CeSystem
from common.app_manager import AppManager

class CpmCe(object):
    def __init__(self):
        self.name = 'apps.cpm.cpm_ce.CpmCe'

    @staticmethod
    def startup(params:Dict = {}) -> None:
        print(f'MiniCPM-4 Context Engineering v0.0.5')
        if params['task'] == 1:
            CpmCe.min_prompt(params=params)
        elif params['task'] == 2:
            params['rows'] = 2
            params['cols'] = 1
            AppManager.init_app(params=params)
            CpmCe.atom_ce_prompt(params=params)
        elif params['task'] == 3:
            CpmCe.run(params=params)
        elif params['task'] == -1:
            CpmCe.t001(params=params)

    @staticmethod
    def run(params:Dict = {}) -> None:
#         query = '''
# 假设一个工作频率为$5.6\\times 10^{9}\\text{Hz}$，天线增益为45.0dB，有效噪声温度为290.0K，带宽为$5.0\\times 10^{6}\\text{Hz}$，噪声系数为3.0dB，系统损耗为6.0dB，计算25Km到165Km范围内，分为1000个距离单元，对每个距离单元分别计算：1. 雷达截面积rCS分别为：$0.1\\text{m}^{2}$、$0.01\\text{m}^{2}$、$1.0\text{m}^{2}$时，信噪比与距离之间的关系并绘制曲线；2. 雷达的峰值功率分别为：$1.5\\times 10^{6} \\text{W}$、$0.6\\times 10^{6}\\text{W}$、$2.7\\times 10^{6}\\text{W}$时，信噪比与距离之间的关系并绘制曲线；
# '''
#         query = '''
# 假设一个工作频率为$5.6\\times 10^{9}\\text{Hz}$，发射功率为$1.0\\times 10^{6}\\text{W} $，天线增益为40.0dB，雷达截面积为$0.1\\text{m}^{2}$，有效噪声温度为300.0K，噪声系数为5.0dB，系统损耗为6.0dB，距离范围为：75Km、100Km、150Km，研究信噪比范围为5dB到20dB，将其分为200等份，求出对应的最小脉冲宽度并绘制曲线。
# '''
#         query = '''
# 某雷达参考距离为86Km，参考脉宽为0.1us，参考信噪比为20.0dB，参考雷达截面积为0.1$m^{2}$，处理损耗为2.0dB，当前距离为120Km，当前RCS为0.2$m^{2}$，当前脉冲宽度为0.1us，计算当前的信噪比。
# '''
#         query = '''
# 设计一个地基雷达，可以识别10公里外的飞机和2公里外的导弹，最大探测距离为60公里。假设飞机的平均RCS为6dBsm，导弹平均RCS为-10dBsm。雷达水平搜索范围为$360^{\circ}$，竖直搜索范围为$10^{\circ}$。扫描率为2秒。距离精度为150米。假设噪声数为8dB，接收噪声为10dB。使用fan beam，水平波束宽度小于3度，SNR为15dB。请确定水平波束宽度。
# '''
#         query = '''
# 一个MMW雷达规范如下：中心频率$f=94GHz$，脉冲宽度$\\tau=50\\times 10^{-9} s$，峰值功率$P_{t}=4W$，水平扫描范围$\\Theta_{A}=\\pm 120^{\\circ}$，脉冲重复频率$PRF=10KHz$，噪声数$F=7dB$，天线直径为$D=12in$，天线增益$G=47dB$，目标RCS为$\\sigma=20m^{2}$，系统损失$L=10dB$，雷达扫描时间$T_{sc}=3s$，温度设为$T_{e}=290K$。距离范围为从1公里到12公里并分为1000份。请计算：波长$\\lambda$；距离分辨率$\\bigtriangleup R$；带宽$B$；天线半功率波束宽度；天线扫描率；计算SNR为10dB时的探测距离；绘制距离与SNR关系的曲线；计算目标得到的脉冲数，当使用脉冲累积时的探测距离，假设SNR不变（与单脉冲时相同）。
# '''
        query = '''
设计一款满足如下功能的搜索和检测地基雷达。威胁包括飞机和导弹两大类。其中飞机的RCS为6dBsm（$\\sigma_{a}=4m^{2}$），导弹平均RCS为-3dBsm（$\\sigma_{m}=0.5m^{2}$）。导弹的高度是2Km，飞机的高度为7Km。水平扫描范围为360度，扫描速度为2秒钟转一圈。采用L到X波段，距离分辨率为150m。角度分辨率暂时不要求。危胁由一个飞机和一个导弹构成。噪声数为$F=6dB$，总接收损失$L=8dB$。采用fan beam方式，水平扫描波束宽度小于3度。假设13dB的信噪比是检测阈值，净空距离为$R_{min}=30Km$，防空导弹的速度为$v_{i}=250m/s$，飞机的速度为$v_{a}=400m/s$，导弹速度为$v_{m}=150m/s$，并且地面是平的。
'''
        # 启动
        system = CeSystem()
        system.startup(user_query=query)















    @staticmethod
    def t001(params:Dict = {}) -> None:
        from apps.cpm.rlm_context import RlmContext
        from apps.cpm.agent.radar_design_v1_agent import RadarDesignV1Agent
        # 将参数写入上下文对象
        context = RlmContext()
        params = {
    "sigmaa": 4.0,
    "sigmam": 0.5,
    "Theta_A": 360.0,
    "T_sc": 2.0,
    "delta_R": 150,
    "nf_dB": 6.0,
    "loss_dB": 8.0,
    "te": 290.0,
    "R_min": 30e3,
    "v_i": 250.0,
    "v_a": 400.0,
    "v_m": 150.0,
    "e_a": 7e3,
    "e_m": 2e3,
    "dec_SNR_dB": 13.0
}
        context.states['params'].update(params)
        context.current_input = '''
设计一款满足如下功能的搜索和检测地基雷达。威胁包括飞机和导弹两大类。其中飞机的RCS为6dBsm（$\\sigma_{a}=4m^{2}$），导弹平均RCS为-3dBsm（$\\sigma_{m}=0.5m^{2}$）。导弹的高度是2Km，飞机的高度为7Km。水平扫描范围为360度，扫描速度为2秒钟转一圈。采用L到X波段，距离分辨率为150m。角度分辨率暂时不要求。危胁由一个飞机和一个导弹构成。噪声数为$F=6dB$，总接收损失$L=8dB$。采用fan beam方式，水平扫描波束宽度小于3度。假设13dB的信噪比是检测阈值，净空距离为$R_{min}=30Km$，防空导弹的速度为$v_{i}=250m/s$，飞机的速度为$v_{a}=400m/s$，导弹速度为$v_{m}=150m/s$，并且地面是平的。
'''
        RadarDesignV1Agent._act(context.states['params'], context, [])








    @staticmethod
    def min_prompt(params:Dict = {}) -> None:
        raw_prompt = \
'''
假设一个工作频率为$5.6\\times 10^{9}\\text{Hz}$，天线增益为45.0dB，有效噪声温度为290.0K，带宽为$5.0\\times 10^{6}\\text{Hz}$，噪声系数为3.0dB，系统损耗为6.0dB，计算25Km到165Km范围内，分为1000个距离单元，对每个距离单元分别计算：1. 雷达截面积rCS分别为：$0.1\\text{m}^{2}$、$0.01\\text{m}^{2}$、$1.0\text{m}^{2}$时，信噪比与距离之间的关系并绘制曲线；2. 雷达的峰值功率分别为：$1.5\\times 10^{6} \\text{W}$、$0.6\\times 10^{6}\\text{W}$、$2.7\\times 10^{6}\\text{W}$时，信噪比与距离之间的关系并绘制曲线；
'''
        print(f'OK? \n{raw_prompt};')
        resp = CpmEngine.infer(query=raw_prompt)
        print(f'resp v1: {resp};')
        intent = MainAgent.recognize_intent(query=raw_prompt)
        if intent == 1:
            print(f'信噪比与距离的关系研究')
            # 基本操作：获取参数、分类、生成、
            # 获取参数
            # 功能调用
            # 其他Agent调用
            # McpServer调用（内部工具，不通过网络）
            # McpServer调用（通过网络调用外部工具）
    
    @staticmethod
    def atom_ce_prompt(params:Dict = {}) -> None:
        
        raw_prompt = \
'''
假设一个工作频率为$5.6\\times 10^{9}\\text{Hz}$，天线增益为45.0dB，有效噪声温度为290.0K，带宽为$5.0\\times 10^{6}\\text{Hz}$，噪声系数为3.0dB，系统损耗为6.0dB，计算25Km到165Km范围内，分为1000个距离单元，对每个距离单元分别计算：1. 雷达截面积rCS分别为：$0.1\\text{m}^{2}$、$0.01\\text{m}^{2}$、$1.0\text{m}^{2}$时，信噪比与距离之间的关系并绘制曲线；2. 雷达的峰值功率分别为：$1.5\\times 10^{6} \\text{W}$、$0.6\\times 10^{6}\\text{W}$、$2.7\\times 10^{6}\\text{W}$时，信噪比与距离之间的关系并绘制曲线；
'''
        # atom_prompt = AtomCe.generate(query=raw_prompt)
        # print(f'{atom_prompt}')
        # resp = CpmEngine.infer(query=atom_prompt)
        # print(f'resp: {resp};')
        system = CeSystem()
        rst = system.startup(user_query=raw_prompt)
        print(f'运行结果：\n{rst["result"]};')